# 作者: 薛文寅仟
# 2025年01月03日17时04分35秒
# 5443912@qq.com
import copy


def use_list_copy():
    """
    使用列表自身的copy,是浅拷贝,b变了但a没变
    如果对象没有嵌套结构（即对象是“扁平”的，比如简单列表、简单字典等）
    ，浅拷贝的效果和深拷贝是一样的，因为浅拷贝已经复制了最外层的对象
    ，而深拷贝在这种情况下也没有额外的嵌套对象需要递归复制。
    所以对象为非嵌套结构时，浅拷贝和深拷贝一样，都会改变
    为嵌套结构时，浅拷贝会变，深拷贝不会变
    """
    a = [1, 2, 3]
    b = a.copy()
    b[0] = 10
    print(a)
    print(b)


def use_copy():
    c = [1, 2, 3]
    d = copy.copy(c)
    d[0] = 10
    print(id(c))
    print(id(d))
    print(c)
    print(d)


def use_copy2():
    """
    copy.copy是浅拷贝,只做第一层copy
    """
    a = [1, 2]
    b = [3, 4]
    c = [a, b]
    d = copy.copy(c)
    print(id(c))
    print(id(d))
    a[0] = 10
    print(f'c={c}')
    print(f'd={d}')
    print('-' * 50)
    print(id(c[0]), id(c[1]))
    print(id(d[0]), id(d[1]))


def use_deepcopy():
    """
    递归去copy，不管有多少层，都会新做一个空间，把数据拿进来
    """
    a = [1, 2]
    b = [3, 4]
    c = [a, b]
    d = copy.deepcopy(c)
    print(id(c))
    print(id(d))
    a[0] = 10
    print(f'c={c}')
    print(f'd={d}')
    print(id(c[0]), id(c[1]))
    print(id(d[0]), id(d[1]))


class Hero:
    def __init__(self, name, blood):
        self.name = name
        self.blood = blood
        self.equipment = ['鞋子', '指环']


def use_copy_own_obj():
    """
    实际对于自定义对象的练习
    """
    old_hero = Hero('蚂蚁', 90)
    new_hero = copy.deepcopy(old_hero)
    new_hero.blood = 80  # 新对象修改后，原对象不会受到任何影响
    new_hero.equipment.append('药水')
    print(old_hero.blood)
    print(old_hero.equipment)
    print(new_hero.blood)
    print(new_hero.equipment)


if __name__ == '__main__':
    # use_list_copy()
    # use_copy()
    # use_copy2()
    # use_deepcopy()
    use_copy_own_obj()
